package cn.bird.util;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 一些包含业务的公共方法
 */
public class CommonFunUtil {

    /**
     * 如果条件正确，那么
     */
    public static void ifTrueRun(boolean check, Runnable run){
        if (check) {
            run.run();
        }
    }

    /**
     * 如果条件为真，则抛出异常
     */
    public static void ifTrueThrow(boolean check, RuntimeException exception) {
        if (Objects.isNull(exception)) {
            return;
        }
        ifTrueRun(check,()->{throw exception;});
    }

    /**
     * 判断如果对象不为空，则执行 Runnable
     */
    public static <T> void notNullThen(T obj, Consumer<T> consumer) {
        if (Objects.isNull(consumer)) {
            return;
        }
        ifTrueRun(Objects.nonNull(obj), () -> consumer.accept(obj));
    }
    /**
     * 获取列表的第一个.结果使用Optional包装
     */
    public static <T> Optional<T> list2First(List<T> ts) {
        if (CollUtil.isEmpty(ts)) {
            return Optional.empty();
        }
        return Optional.ofNullable(ts.get(0));
    }
    /**
     * 执行 {@param set}Consumer动作;
     * 如果 {@param value}为空(空字符串也算)，则使用{@param defaultValue}，
     * 作为参数传入{@param set}中
     */
    public static <T> void ifEmptyDefaultThen(Consumer<T> set, T value, T defaultValue) {
        ifEmptyDefaultDeal(set, value, defaultValue, null);
    }
    /**
     * 执行 {@param set}Consumer动作;
     * 如果 {@param value}为空(空字符串也算)，则使用{@param defaultValue}，再经过{@param deal}(若不为空)处理后，
     * 作为参数传入{@param set}中
     */
    public static <T> void ifEmptyDefaultDeal(Consumer<T> set, T value, T defaultValue, Function<T, T> deal) {
        if (Objects.isNull(set)) {
            return;
        }
        if (ObjectUtil.isEmpty(value)) {
            value = defaultValue;
        }
        if (Objects.nonNull(deal)) {
            value = deal.apply(value);
        }
        set.accept(value);
    }

    /**
     * 单一的列表转换
     * 将List<T> 经指定转换器 {@param t2r} 转换为List<R>
     */
    public static <T, R> List<R> listConvert(List<T> currentList, Function<T, R> t2r) {
        if (CollUtil.isEmpty(currentList)) {
            return new ArrayList<>();
        }
        return currentList.stream()
                .map(t2r)
                .filter(Objects::nonNull)
                .collect(Collectors.toList());
    }

    /**
     * 添加元素的list中，集中判断list为空的情况
     */
    public static <T> List<T> addToList(List<T> ts, T t) {
        if (CollUtil.isEmpty(ts)) {
            ts = new ArrayList<>();
        }
        ts.add(t);
        return ts;
    }
}
